package Graphisme;



import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.JRadioButton;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.BoxLayout;
import java.awt.CardLayout;
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;

import Modele.CombinaisonTuile;
import Modele.Joueur;
import Modele.Partie;
import Modele.Pile;
import Modele.Plateau;
import Modele.TuilePouvoir;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Random;

public class Fenetre extends JFrame {
	private JRadioButton tranche1, tranche2, tranche3, tranche4;
	JPanel content = new JPanel();
	CardLayout cl = new CardLayout();
	String[] listContent = {"mainmenu","SelectionPeuple", "CARD_2","result"};
	int indice = 0;
	public JPanel[][] tabUV = new JPanel[6][5];
	private JPanel selectionPeuple;
	private JPanel mainmenu;
	private JPanel selectionPeuple_left;
	private JPanel selectionPeuple_right;
	private final int width=800;
	private final int height=680;
	private int page=0;
	private int choice=0;
	private String press="";
	private String step="occupy";
	private String done="deploy";
	private String nomplayer="";
	private boolean isdeclin=true;
	private Pile pile=new Pile();
	private JPanel[] goldadd=new JPanel[6];
	private JPanel[] gold_=new JPanel[6];
	private Combinaison[] combo;
	private Partie partie;
	private JLabel cover;
	private JLabel infoplayer;
	private int nbplayer;
	private JPanel card2;
	private Plateau pla;
	private JLabel jb1;
	private JLabel jb2;
	private JLabel jb1_1;
	private JPanel plateau;
	private JPanel jjjj3;
	private JPanel jjjj4;
	private JPanel result;
	private JButton quitter;
	private JButton nouvellePartie;
	private int gain=-1;
	private int tour=10;
	public SaveThread ST;
	ObjectInputStream in;
	private int startoccupy=0;
	public Fenetre(){
	
		//creation de la fenètre  du jeu
		this.setTitle("Small UTBM's World");
		this.setSize(width,height);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
 ST=new 	SaveThread();
		
		// Panel d'affichage du choix des tuiles "élève" et "pouvoir"
		//composé de 2 panel, Peuple-right et Peuple-left
		selectionPeuple = new JPanel();
		selectionPeuple.setLayout(new GridLayout(0, 2));
		
		//mainmenu = panel d'acceuil du jeu (choix nouvelle partie, continuer ou quitter)
		mainmenu = new JPanel();
		cover = new JLabel(new ImageIcon("images/cover.jpg"));
		mainmenu.add(cover);
		mainmenu.addMouseListener(new movoListener());
		
		//panel d'affichage des différentes combinaison
		selectionPeuple_left=new JPanel();
		selectionPeuple_left.setLayout(new BoxLayout(selectionPeuple_left, BoxLayout.PAGE_AXIS));
		combo=new Combinaison[6];
		drawpage2();

		//Panel d'affichage des informations sur les combinaisons
		selectionPeuple_right=new JPanel();
		selectionPeuple_right.setLayout(new GridLayout(4, 0));
		
		//panel d'affichage des resultats
		result= new JPanel();
		result.setLayout(null);
		
		result.addMouseListener(new movoListener());
		nomplayer="cao";
		selectionPeuple.add(selectionPeuple_left);
		selectionPeuple.add(selectionPeuple_right);
		selectionPeuple.addMouseListener(new movoListener());
		
		// panel d'affichage du plateau
		card2 = new JPanel();
		card2.setLayout(null);
		card2.setBackground(Color.white);		
		
		//On dÃ©finit le layout
		content.setLayout(cl);
		//On ajoute les cartes Ã  la pile avec un nom pour les retrouver
		drawresult();
		
		content.add(mainmenu, listContent[0]);

		content.add(selectionPeuple, listContent[1]);
		content.add(card2, listContent[2]);
		content.add(result, listContent[3]);
		this.getContentPane().add(content, BorderLayout.CENTER); // on positionne nos 4 panels au centre de la Fenetre principale
		this.setVisible(true);
	this.addWindowListener(new WindowListener(){

	

		@Override
		public void windowClosing(WindowEvent arg0) {
			// TODO Auto-generated method stub
			System.out.println("guanbi");
			if(page!=0)
			try {ST.stop();
				ST.oos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			javax.swing.JOptionPane.showMessageDialog(null,"Thank you for playing.The record of game will be saved automatically"); 
		}

		@Override
		public void windowActivated(WindowEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void windowClosed(WindowEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void windowDeactivated(WindowEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void windowDeiconified(WindowEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void windowIconified(WindowEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void windowOpened(WindowEvent e) {
			// TODO Auto-generated method stub
			
		}
});
	//	System.out.println(this.getLocationOnScreen()+"");
		
	}


	public void drawresult(){ //affichage de la page 4, on affiche le score de chaque joueur

		//result.removeAll();
		JPanel result1 = new JPanel();
		result1.setLayout(null);
		JLabel resultlab = new JLabel(new ImageIcon("images/result.jpg"));
		resultlab.setBounds(0,20, 800, 600);
	
		JLabel resultlabt = new JLabel("player1");
		resultlabt.setFont(new Font("ºÚÌå",Font.BOLD,20));
		result1.add(resultlabt);
		result1.setBounds(330,295, 120, 60);
		RotatePanel rott = new RotatePanel();
		rott.setBounds(0,20, 800, 600);
		result.add(rott );
	//	result.add(resultlab);
		// affichage titre
	/*	JLabel l2 = new JLabel("RESULTATS");
		l2.setForeground(Color.ORANGE);
		l2.setFont(new Font("ºÚÌå",Font.BOLD,60));
		l2.setPreferredSize(new Dimension(350,75));
		result.add(l2);
		
		// affichage pour chaque joueur de son nom et de son score
		for(int i=0;i<partie.getNbreJoueurs();i++)
		{
			JLabel l = new JLabel("player : "+partie.joueurs[i].getNomJoueur()+"     SCORE : "+partie.joueurs[i].getPoints());
			l.setForeground(Color.magenta);
			l.setFont(new Font("ºÚÌå",Font.BOLD,35));
			//l.setBounds(40, 150+100*i, 500, 80);
			result.add(l);
		}
		
		// label d'affichage du gagnant de la partie
		JLabel gagn = new JLabel("le gagnant est : " + partie.gagnant().getNomJoueur());
		gagn.setForeground(Color.red);
		gagn.setFont(new Font("Colibri",Font.BOLD,35));
		gagn.setSize(new Dimension(500,100));
		//gagn.setBounds(40, 200+100*partie.getNbreJoueurs(), 500, 70);
		result.add(gagn);
		
		JPanel boutonGroup = new JPanel();
		nouvellePartie = new JButton("Nouvelle Partie");
		nouvellePartie.addMouseListener(new movoListener());
		quitter = new JButton("Quitter");
		quitter.addMouseListener(new movoListener());
		boutonGroup.add(nouvellePartie);
		boutonGroup.add(quitter);
		result.add(boutonGroup);
		*/
	}

	
	public void drawgold(int j){	// on dépose une pièce sur chaque combinaison située au dessus de la tuile selectionnée
		for(int i=0;i<j;i++)
		{
			ImageIcon imageicon = new ImageIcon("images/gold.png");
			Image image = imageicon.getImage();
			BufferedImage bufferedimage = new BufferedImage(60, 60, BufferedImage.TYPE_INT_RGB);
	
			bufferedimage.getGraphics().drawImage(image,0,0,60,60,null);

			imageicon.setImage(bufferedimage);	
			JLabel l = new JLabel(imageicon);
			l.setOpaque(false);
			gold_[i].setLayout(new GridLayout(0, 1));
			gold_[i].add(l);
		}
	
		// normalement, boucle d'affichage des points déposés sur chaque tuiles par les joueurs précédents
		for(int k=0; k<6; k++)
		{
			if(pile.points[k]!=0)
			{	
				// on regarde ici pour afficher les pièces déposées sur les combinaison par les autre joueurs
				// s'il y en a plusieurs on superpose autant d'image d'un pièce qu'il y a de points sur la combinaison
				
				ImageIcon imageicon = new ImageIcon("images/gold.png");
				Image image = imageicon.getImage();
				BufferedImage bufferedimage = new BufferedImage(80, 40, BufferedImage.TYPE_INT_RGB);
				
				for(int q=1;q<=Math.abs(pile.points[k]);q++)
					bufferedimage.getGraphics().drawImage(image,q*20-20,0,80,40,null);
				
				imageicon.setImage(bufferedimage);
				JLabel l = new JLabel(imageicon);
				l.setOpaque(false);
				
				goldadd[k].setLayout(new GridLayout(0, 1));
				goldadd[k].add(l);
						
			}
		}
	}

	
	public void draw2(int i){	// affichage de la page 2, c'est la page de choix de combinaison de tuiles
		selectionPeuple_left.removeAll();	// fonction rafraichissement
		drawpage2();
		drawgold(i);
		selectionPeuple_right.removeAll();
		
		infoplayer=new JLabel("           Name of player : "+partie.getJoueurActuel().getNomJoueur()+"   credits ECTS : "+partie.getJoueurActuel().getPoints());
		selectionPeuple_right.add(infoplayer);
		Combinaison c;
		
		c=new Combinaison(pile.getPeuple(i).getNomPeuple(),pile.getPeuple(i).getDescription());
		selectionPeuple_right.add(c);				// on ajoute la description du peuple

		c=new Combinaison(pile.getPouvoir(i).getNom(),pile.getPouvoir(i).getDescription());
		selectionPeuple_right.add(c);				// on ajoute la description du pouvoir
		
		JButton button = new JButton("pick");		// creation du bouton qui permet de choisir la combinaison de tuile.
		button.setBackground(Color.yellow);
		button.setPreferredSize(new Dimension(80,40));
		JPanel p=new 	JPanel();
		p.setLayout(null);

		button.setBounds(300, 0, 80, 40);

		choice=i;
		button.addActionListener(new ActionListener(){		// l'action sur ce bouton permet d'enregistrer les tuiles choisies dans la main du joueur
				
			public void actionPerformed(ActionEvent e) {
				
				//on met la combinaison dans la main du joueur
				partie.getJoueurActuel().setActive(new CombinaisonTuile(pile.getPeuple(choice),pile.getPouvoir(choice)));

				// on récupère les points déposés sur la combinaison choisie
				partie.getJoueurActuel().ajoutPoints(pile.getPoints(choice)); 
				// on récupère les points bonus de la Tuile pouvoir s'il y en a
				partie.getJoueurActuel().ajoutPoints(partie.getJoueurActuel().getActive().getPouvoir().pointsDepart());
				//on remet le compte de points à zéro pour la combinaison choisie
				pile.suprPoints(choice);
				
				// on retire 1 point dans la main du joueur pour chaque tuile au dessus de celle choisie
				partie.getJoueurActuel().pertePoints(choice);
				
				// on supprime les Tuiles que le joueur a choisi
				// on ajoute un point sur chaque tuile au dessus de celle choisie
				pile.supr(choice);
				
				//on affiche la plateau de jeu
				swapPlateau(2);
			}
		});
		p.add(button);
		selectionPeuple_right.add(p);
		selectionPeuple_left.revalidate(); //rafraichissement
		selectionPeuple_right.revalidate(); 
	}
	
	
	public void drawpage2(){
		for(int i=0;i<6;i++)
		{			
			// creation des 6 labels qui affichent chacun une combinaion de tuiles peuple et pouvoir
			combo[i] = new Combinaison(pile.getPeuple(i).getNomPeuple()+" ++ "+pile.getPouvoir(i).getNom());
			ImageIcon imageicon = new ImageIcon("Races/"+pile.getPeuple(i).getNomPeuple()+".png");
			Image image = imageicon.getImage();
			ImageIcon imageicon2 = new ImageIcon("int/"+pile.getPeuple(i).getNbrePions()+".png");
			Image image2 = imageicon2.getImage();
			BufferedImage bufferedimage = new BufferedImage(80, 80, BufferedImage.TYPE_INT_RGB);
			bufferedimage.getGraphics().drawImage(image,0,0,80,80,null);
			bufferedimage.getGraphics().drawImage(image2,60,60,20,20,null);
			imageicon.setImage(bufferedimage);
			JLabel l = new JLabel(imageicon);

			goldadd[i]= new JPanel();
			goldadd[i].setPreferredSize(new Dimension(20, 5));
			gold_[i]= new JPanel();
			gold_[i].setPreferredSize(new Dimension(20, 5));
			combo[i].setgoldadd(goldadd[i]);
			goldadd[i].setBackground(Color.white);
			gold_[i].setBackground(Color.white);
			combo[i].setpeuple(l);
	
	
			imageicon=new ImageIcon("powers/"+pile.getPouvoir(i).getNom()+".jpg");
			image = imageicon.getImage();
			imageicon2=new ImageIcon("int/"+pile.getPouvoir(i).getNbrePions()+".png");
			image2 = imageicon2.getImage();
			bufferedimage = new BufferedImage(80, 80, BufferedImage.TYPE_INT_RGB);
			bufferedimage.getGraphics().drawImage(image,0,0,80,80,null);
			bufferedimage.getGraphics().drawImage(image2,60,60,20,20,null);
			imageicon.setImage(bufferedimage);
			l= new JLabel(imageicon);
			combo[i].setpouvoir(l);
			//combo[i].addMouseListener(new movoListener());
			combo[i].setgoldadd(gold_[i]);
			selectionPeuple_left.add(combo[i]);
		}	
	}
	
	
	public void swapPlateau(int i){	// fonction de trasnfert vers la page d'indice i (1 = page d'acceuil, 2, selection combinaison, 3 = plateau de jeu, 4 = resultats/Fin
		dialogue(page,i);
		page=i;
		cl.show(content, listContent[i]);
		if(page==1){
			// si on arrive sur la page 1 (choix de combinaison), on recupère le nom du joueur pour l'afficher sur la page
			draw2(0);
			this.selectionPeuple_right.removeAll();
			nomplayer=partie.getJoueurActuel().getNomJoueur();
			infoplayer=new JLabel("           Name of player : "+nomplayer);
			selectionPeuple_right.add(infoplayer);
		}
		if(page==2){
			draw3();
		}
		if(page==3){
			drawresult();
		}
	}

	
	private int usedie(TuilePouvoir t) { //lancer le dé de renfort 
	
	int nbreEssais=0;
	int p;
	do{
	   
        p=(int)(Math.random()*4);
       // tirage d'un nombre au hasard entre 0 et 4 d'après la formule
       //(int)(Math.random()*(max-min))+min

       Object[] options = {"OK"};
       if((p==0)&&(t.retryThrowing()==true)&& nbreEssais<2){
	       JOptionPane.showOptionDialog(this,
	    		   "Lancement du de de renfort ...\n vous faite un "+ p +" !\n Vous avez le droit de relancer les dés",
	    		   "De de renfort",
	    		   JOptionPane.INFORMATION_MESSAGE,
	    		   JOptionPane.INFORMATION_MESSAGE,
	    		   new ImageIcon("images/de.png"),
	    		   options,
	    		   options[0]);
       }else{
    	   JOptionPane.showOptionDialog(this,
	    		   "Lancement du de de renfort ...\n vous faite un "+ p +" !",
	    		   "De de renfort",
	    		   JOptionPane.INFORMATION_MESSAGE,
	    		   JOptionPane.INFORMATION_MESSAGE,
	    		   new ImageIcon("images/de.png"),
	    		   options,
	    		   options[0]);
       }
       nbreEssais+=1;
	} while((p==0)&&(t.retryThrowing()==true)&& nbreEssais<2);
	   	// TODO Auto-generated method stub
		return p+t.appelRenfort();
	}

	
	private void dialogue_deploy() {  
	     Object[] options = {"OK"};
		JOptionPane.showOptionDialog(this,
				"Redeployer vos troupes  " + partie.getJoueurActuel().getNomJoueur(),
				"Redeploiement",
				JOptionPane.INFORMATION_MESSAGE,
				JOptionPane.INFORMATION_MESSAGE,
				null,
				options,
				options[0]);
    
		// TODO Auto-generated method stub	
	}
	
	
	private void draw3() {	
		
		card2.removeAll();
		
		ImageIcon imageicon;
		ImageIcon imageicon2;
		Image image ;
		Image image2 ;
		BufferedImage bufferedimage;
		JLabel jb0;
	/*	if(gain!=-1)
		{int sizejb123=50;
		//affichage de la tuile pouvoir
		imageicon = new ImageIcon("images/gold.jpg");	//afficher la tuile pouvoir
		image = imageicon.getImage();
		bufferedimage = new BufferedImage(sizejb123, sizejb123, BufferedImage.TYPE_INT_RGB);
		bufferedimage.getGraphics().drawImage(image,0,0,sizejb123,sizejb123,null);
		imageicon.setImage(bufferedimage);
		JLabel jb123 = new JLabel(imageicon); 
		jb123.setBounds(300, 400, sizejb123, sizejb123);
		card2.add(jb123);
		
		
		
		}*/
		//plateau est le Panel contenant toutes les regions
		plateau = new JPanel();
		plateau.setLayout(new GridLayout(6,5));
		for(int i=0;i<6;i++){
			for(int j=0;j<5;j++){
				tabUV[i][j] = new JPanel();		// tabUV correspond à une region du plateau
				tabUV[i][j].setPreferredSize(new Dimension(150, 85));
				tabUV[i][j].setLayout(null);
			
				imageicon= new ImageIcon("images/"+pla.T[i][j].getNomRegion()+".png");
				image = imageicon.getImage();
				//icon.setBounds(0, 0, 150, 85);
				bufferedimage = new BufferedImage(150, 85, BufferedImage.TYPE_INT_RGB);
				bufferedimage.getGraphics().drawImage(image,0,0,150,85,null);
	
				// on teste si la region est occupée par un joueur si elle est occupée, suivant si le peuple est en déclin ou 
				// on actif l'image dans la region est différente
				if(pla.T[i][j].getJoueur()!=null){
					if(pla.T[i][j].getJoueur().getActive()!=null){
						if(pla.T[i][j].getJoueur().getActive().is_in(pla.T[i][j]))
							imageicon2 = new ImageIcon("Races/"+pla.T[i][j].getJoueur().getActive().getPeuple().getNomPeuple()+".png");
						else
							imageicon2 = new ImageIcon("Races/"+pla.T[i][j].getJoueur().getDeclin().getPeuple().getNomPeuple()+"1.png");
					}
					else
					imageicon2 = new ImageIcon("Races/"+pla.T[i][j].getJoueur().getDeclin().getPeuple().getNomPeuple()+"1.png");
					
					image2 = imageicon2.getImage();
					for(int t=0;t<pla.T[i][j].getNbrePions();t++)
						// pour afficher le nombre de peuple sur un territoire
						if(t<=5){
						bufferedimage.getGraphics().drawImage(image2,70+t*5,35+t*5,30,30,null); 
					
					ImageIcon imageicon3 = new ImageIcon("int/"+pla.T[i][j].getNbrePions()+".png");
					Image image3 = imageicon3.getImage();
					
					bufferedimage.getGraphics().drawImage(image3,60,35,10,10,null);
						}
				}
				
				
				imageicon.setImage(bufferedimage);
				jb0=new JLabel(imageicon); 
				jb0.setBounds(0, 0, 150, 85);	
				
				tabUV[i][j].add(jb0);
				
				plateau.add(tabUV[i][j]);
			}
		}
	
		plateau.setBounds(20, 20, 750, 510);
		plateau.addMouseListener(new movoListener());
		card2.add(plateau);	
		// TODO Auto-generated method stub
		
		// on affiche la ligne "avancement, joueur actuel et nb de points
		JLabel jb = new JLabel("Tour : "+partie.getTourCourant()+"  Joueur : "+partie.getJoueurActuel().getNomJoueur()+"   Credits ECTS : "+partie.getJoueurActuel().getPoints()+" ");
		jb.setFont(new Font("ºÚÌå",Font.BOLD,15));	
		
		//affichage de la tuile peuple
		imageicon = new ImageIcon("Races/"+partie.getJoueurActuel().getActive().getPeuple().getNomPeuple()+".png");	// afficher la tuile peuple
		image = imageicon.getImage();
		int sizejb1=50;
		if(press=="peuple")
			sizejb1=55;
		bufferedimage = new BufferedImage(sizejb1, sizejb1, BufferedImage.TYPE_INT_RGB);
		bufferedimage.getGraphics().drawImage(image,0,0,sizejb1,sizejb1,null);
		imageicon.setImage(bufferedimage);
		jb1=new JLabel(imageicon); 
		int sizejb2=50;
		//affichage de la tuile pouvoir
		imageicon = new ImageIcon("powers/"+partie.getJoueurActuel().getActive().getPouvoir().getNom()+".jpg");	//afficher la tuile pouvoir
		image = imageicon.getImage();
		bufferedimage = new BufferedImage(sizejb2, sizejb2, BufferedImage.TYPE_INT_RGB);
		bufferedimage.getGraphics().drawImage(image,0,0,sizejb2,sizejb2,null);
		imageicon.setImage(bufferedimage);
		jb2=new JLabel(imageicon); 

	

		JPanel jjjj = new JPanel ();
		JPanel jjjj2 = new JPanel ();
		jjjj3 = new JPanel ();
		jjjj4 = new JPanel ();
		
		// jb1_1 affiche le nombre de pions dans la main du joueur
		jb1_1 = new JLabel(partie.getJoueurActuel().getActive().getNbrePions()+" ");
		jb1_1.setForeground(Color.RED);
		jb1_1.setFont(new Font("ºÚÌå",Font.BOLD,20));
		
		jjjj.setBackground(Color.WHITE);
		jjjj.setBounds(620, 530, 40, 30);
		jjjj.add(jb1_1);
		
		jjjj2.setBackground(Color.WHITE);
		jjjj2.setBounds(0, 560, 400, 30);
		jjjj2.add(jb);
	
		//Panel contenant la tuile peuple
		jjjj3.setBackground(Color.WHITE);
		jjjj3.setBounds(550, 550, 50, 50);
		jjjj3.add(jb1);
		jjjj3.addMouseListener(new movoListener());
		
		//panel contenant la tuile pouvoir
		jjjj4.setBackground(Color.WHITE);
		jjjj4.setBounds(660, 550, 50, 50);
		jjjj4.add(jb2);
		jjjj4.addMouseListener(new movoListener());

		card2.add(jjjj2);
		card2.add(jjjj);
		card2.add(jjjj3);
		card2.add(jjjj4);
	
		if(step=="deploy"||step=="occupy"){
			if(step=="occupy")
				done="stop occupy";
			else if(done!="fin")
				done="done";
			JButton button_de = new JButton(done);			// bouton de fin de tour
			button_de.setBackground(Color.yellow);
			button_de.setPreferredSize(new Dimension(120,50));
			button_de.addActionListener(new ActionListener(){		
				

				public void actionPerformed(ActionEvent e) {
					if(step=="occupy")
					{step="deploy";
					done="done";
					dialogue_deploy();
					draw3();
					//done="deploy";
					}
					else
					if(done=="fin"){
						
							isdeclin=true;	//???????????????????????????????????????;
							partie.joueurSuivant();
							partie.setNumReprise(partie.getNumJoueurCourant());								
							//on regarde l'avancement, si on est arrivé au bout, on affiche le résultat
							System.out.println(partie.getJoueurActuel().getNomJoueur()+" commence son tour");
							if(partie.getTourCourant()>partie.getTours())
							{	
								swapPlateau(3);
							}
							
							// si le joueur qui va jouer n'a pas de combinaison, on affiche la page de selection de combinaison
							if(partie.getJoueurActuel().getActive()==null)
							{
								System.out.println("joueur suivant : selection combinaison");
								draw2(0);
								press="";
								step="occupy";
								startoccupy=0;
								done="deploy";
								
								page=1;
							
								cl.show(content, listContent[1]);
							}
							else
							{
								// sinon on prépare ses troupes (plus qu'un seul pion dans chaque region
								partie.getJoueurActuel().preparation();
								System.out.println(" joueur  "+partie.getJoueurActuel().getNomJoueur()+ " : preparation");
								press="";
								step="occupy";
								startoccupy=0;
								done="deploy";
								draw3();
							}
					}
					else
					{
						// on vérifie maintenant si le jouer possède encore des pions en main.
				/*		if(partie.getJoueurActuel().getActive().getNbrePions()!= 0){
							javax.swing.JOptionPane.showMessageDialog(null,"Il vous reste des pions en main."); 
							System.out.println("attention, il vous reste des pions en main ! veuillez les deposer sur le plateau");
							draw3();
						}*/
					//	else{
							
							/** la boucle de redépoiement des pions revenus dans la main des autre joueurs************************/						
						/*
							if (partie.aRedeployer()!=null){
								Joueur jou = partie.aRedeployer();
								System.out.println("le joueur : " + jou.getNomJoueur() +" a des pions en main");
								System.out.println("\t il possede " + jou.getActive().getNbrePions()+" pions");
								
								if(partie.getNumJoueurCourant()==partie.getNumReprise()){
									partie.setNumReprise(partie.getNumJoueurCourant());		//on récupère le num du joueur courant
								}
								
								partie.setNumJoueurCourant(partie.getNumJoueur(jou));	// on donne la main au joueur qui doit replacer ses pions
								System.out.println("joueur actuel : "+partie.getJoueurActuel().getNomJoueur());
								step="deploy";
								done="deploy";
								dialogue_deploy();
								draw3();
							}*/
						//	else{
							
								if(partie.getNumJoueurCourant()!=partie.getNumReprise()){
									partie.setNumJoueurCourant(partie.getNumReprise());
								}
								
								partie.getJoueurActuel().gainPointsFinTour();
						
								
								done="fin";
								draw3();
								System.out.println("nb pieces du joueur "+ partie.getJoueurActuel().getNomJoueur()+" : "+partie.getJoueurActuel().getPoints());
								System.out.println("fin du tour du joueur");
						//	}
					//	}
					}
			
				}});	// de la declaration ActionPeformed du bouton_de
			
			button_de.setBounds(400, 550, 120, 50);
			card2.add(button_de);
			card2.repaint();
		
		}	// fin étape redéploiement
		
		if((step=="occupy")&&(isdeclin)&&(!partie.getJoueurActuel().getnewpeuple()))
		{
			// si nous sommes en mode conquète (occupy) et que nous ne venons pas à l'instant 
			//d'acquérir une combinaison on crée le bouton déclin
			JButton button_de = new JButton("declin");
			button_de.setBackground(Color.yellow);
			button_de.setPreferredSize(new Dimension(80,40));
			button_de.addActionListener(new ActionListener(){
				
					public void actionPerformed(ActionEvent e) {
						partie.getJoueurActuel().passageDeclin(pile);
						
					/*	isdeclin=true;
						partie.getJoueurActuel().gainPointsFinTour(); 
						int avant=partie.getJoueurActuel().getPoints();
						gain=partie.getJoueurActuel().getPoints()-avant;
						draw3();
						long time=System.currentTimeMillis();
						while(System.currentTimeMillis()<time+500)
						{}
						gain=-1;
						*/
												// on fait gagner les points pour les 
												//territoires au joueur qui vient passer en déclin avant de passer au joueur suivant
						System.out.println(partie.getJoueurActuel().getNomJoueur()+" : passage declin");
						System.out.println("nb pieces du joueur "+ partie.getJoueurActuel().getNomJoueur()+" : "+partie.getJoueurActuel().getPoints());
						System.out.println("fin du tour du joueur");
						
						partie.joueurSuivant();
						partie.setNumReprise(partie.getNumJoueurCourant());
						
						if(partie.getJoueurActuel().getActive()==null)
						{	
							// si le joueur suivant n'a pas de combinaison ou affiche la selection de combinaison
							System.out.println(" joueur suivant : selection Combinaison");
							draw2(0);
							press="";
							step="occupy";startoccupy=0;
							done="deploy";
				
							page=1;
				
							cl.show(content, listContent[1]);
					
					
						}
						else
						{
							//sinon on récupère les pions déposé sur la plateau pour pouvoir rejouer
							partie.getJoueurActuel().preparation();
							System.out.println(" joueur  "+partie.getJoueurActuel().getNomJoueur()+ " : preparation");
							press="";
							step="occupy";
							startoccupy=0;
							done="deploy";
							draw3();
						}
					}});	// fin actionPerformed()
			button_de.setBounds(200, 530, 80, 20);
			card2.add(button_de);
			card2.repaint();

		}
		
		card2.revalidate(); 
	}	// fin void draw3()
	
	
	public void dialogue(int p,int j)		// lors du passage de la page 0 vers la page 1, on affiche les boites de dialogues "nb de joueurs", " noms des joueurs"  
	{
		if((p==0)&&(j==1))
		{
			try 
			{
				// boite de dialogue choix du nombre de joueurs
				String[] player = {"2 joueurs", "3 joueurs", "4 joueurs"};
				nbplayer=JOptionPane.showOptionDialog(null, 
						"Veuillez choisir le nombre de joueur.",
						"Selection du Nombre de joueur",
						JOptionPane.YES_NO_CANCEL_OPTION,
						JOptionPane.QUESTION_MESSAGE,
						null,
						player,
						player[2]) + 2;
			/*	switch (nbplayer){
					case 2: tour = 10;
					case 3: tour = 10;
					case 4: tour = 10;
				}*/
			} catch (Exception e2) {}
			
			partie=new Partie("",nbplayer,tour);
			pile.cleanPoints();
			pile.melangeTuile();
			pla=new Plateau();
			
			for(int i=0;i<nbplayer;i++)
				try 
				{
					String str=JOptionPane.showInputDialog(this,"The name of player "+(i+1)+" : ");
					partie.joueurs[i]=new  Joueur(str);
				} catch (Exception e3) {}
		}
		
		if((p==0)&&(j==0))	// on arrive ici quand on clique sur quitter, message de confirmation "voulz vous quitter ?"
		{
			Object[] options = {"Yes","No"};
	
	        int n = JOptionPane.showOptionDialog(this,"Would you want to leave ","quit",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[1]);
			if(n==0)
	        System.exit(0);
		}
		if((p==0)&&(j==-1))
		{JOptionPane.showMessageDialog(this , "No record,start new game" ,"Sorry " , JOptionPane.ERROR_MESSAGE) ;}
	}		//fin void dialogue()
	class SaveThread extends Thread {
		
		FileOutputStream fos;
		ObjectOutputStream oos;
		
	
		SaveThread(){
			
		
		}
		
		
		
		public void run(){
			
			
			
			while(1==1){
			
			long sst=System.currentTimeMillis();
			while(System.currentTimeMillis()<sst+500)
			yield();
		//	System.out.println("write data");
		try {
	//	if(pile!=null)
			
			
			try {
				fos= new FileOutputStream("t.tmp");
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				oos= new ObjectOutputStream(fos);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			
		oos.writeObject(pile);
	//	if(partie!=null)
	oos.writeObject(partie);
		
			oos.writeObject(nbplayer);
			oos.writeObject(indice);
	
			oos.writeObject(page);
			oos.writeObject(press);
			if(step=="occupy")
			oos.writeObject(1);
			else if(step=="deploy")
				oos.writeObject(2);
			else
				oos.writeObject(0);
			oos.writeObject(done);
			oos.writeObject(isdeclin);
	//if(pla!=null)
	oos.writeObject(pla);
			oos.writeObject(tour);
		//	oos.writeObject(done);
		//	System.out.println(page);	
			} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
			
			
			
			
			
			
			
			
			}		
			
		
		
		}
		
		
		
		
		
	}
	class RotatePanel extends JPanel {
		protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		ImageIcon imageicon = new ImageIcon("images/result.jpg");
		Image image = imageicon.getImage();
		Graphics2D g2d = (Graphics2D) g;

		g2d.setColor(Color.WHITE);
		g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
	
		Font f = new Font("Consolas",Font.BOLD,26);
	//	Color[] colors = { Color.ORANGE, Color.LIGHT_GRAY };

		//　 平移原点到图形环境的中心
		g2d.translate(0, 0);
		g2d.drawImage(image,0,0,800,600,null);
	
		//　 旋转文本
		g2d.translate(320, 314);
		g2d.setPaint(Color.black);
		g2d.setFont(new Font("Consolas",Font.BOLD,32));
		g2d.drawString( partie.gagnant().getNomJoueur(), 0, 0);
		g2d.setFont(f);
		g2d.translate(-80, 100);
		g2d.rotate(20 * Math.PI / 180);
		g2d.drawString(partie.joueurs[0].getNomJoueur(), 0+nbplayer*3, 0+nbplayer*3);
		g2d.translate(0, 55);
		g2d.setFont(new Font("Consolas",Font.BOLD,60));
		g2d.setPaint(Color.red);
		g2d.drawString(partie.joueurs[0].getPoints()+"", 0+nbplayer*3, 0+nbplayer*3);
		if(nbplayer>2)
		{
		imageicon = new ImageIcon("images/score.png");
		image = imageicon.getImage();
		g2d.drawImage(image,-140,-80,140,180,null);
		g2d.setPaint(Color.black);
		g2d.setFont(f);
		g2d.drawString(partie.joueurs[2].getNomJoueur(), -130,-22);
		g2d.translate(0, 55);
		g2d.setFont(new Font("Consolas",Font.BOLD,60));
		g2d.setPaint(Color.BLUE);
		g2d.drawString(partie.joueurs[2].getPoints()+"", -130,-22);
		}
		g2d.setPaint(Color.black);
		g2d.setFont(f);
		g2d.translate(235, -98);
		g2d.rotate(-45 * Math.PI / 180);
		g2d.drawString(partie.joueurs[1].getNomJoueur(), 4+nbplayer*4,-1-nbplayer*7);
		g2d.translate(0, 55);
		g2d.setFont(new Font("Consolas",Font.BOLD,60));
		g2d.setPaint(Color.green);
		g2d.drawString(partie.joueurs[1].getPoints()+"", 4+nbplayer*4,-1-nbplayer*7);
		//g2d.drawImage(image,0,0,800,600,null);
		if(nbplayer>3)
		{
		g2d.drawImage(image,130,-130,140,200,null);
		g2d.setPaint(Color.black);
		g2d.setFont(f);
		g2d.drawString(partie.joueurs[3].getNomJoueur(),160,-70);
		g2d.translate(0, 55);
		g2d.setFont(new Font("Consolas",Font.BOLD,60));
		g2d.setPaint(Color.ORANGE);
		g2d.drawString(partie.joueurs[3].getPoints()+"",160,-70);
		
		}

		}}
	class movoListener implements MouseListener {	// classe permettant l'ecoute des combinaison.

		private int fromx;
		private int fromy;
	
	
		
		public void mouseReleased(MouseEvent e) {  // System.out.println("fdg");
		// System.out.println("page "+page);
		// if(step=="occupy")
		// System.out.println("step "+step+"occupy");
			/*méthode utilisée pour jouer sur le plateau*****/	
				if((page==2)&&(step=="occupy"))
				{	// si nous sommes en phase de conquète, on vérifie que le clic s'est effectué sur la main du joueur
		           System.out.println("fdg");
					if((press=="peuple")&&(	partie.getJoueurActuel().getActive().getNbrePions()>0))	
					{
						int ppppp=(e.getX()-20+550)/150;
						int qqqqq=(e.getY()-20+550)/85;
						//	int foisdia=0;
						// controle si la case est adjacente aux térritoire du joueur + si la region n'est pas déja acquise par le joueur + si la région peut etre occupée.
						if((pla.controlFrontalier(qqqqq, ppppp, partie.getJoueurActuel()))&&(!partie.getJoueurActuel().getActive().is_in(pla.T[qqqqq][ppppp]))&&((pla.T[qqqqq][ppppp].getAtout()!="0")|| partie.getJoueurActuel().getActive().getPouvoir().conqueteVide(pla.T[qqqqq][ppppp])))
						{
							isdeclin=false;
							if(partie.getJoueurActuel().getActive().getPouvoir().dette(partie)==true && partie.getJoueurActuel().getActive().getNbrePions()>=1 ){
								
								partie.getJoueurActuel().ajoutRegion(pla.T[qqqqq][ppppp]);
								startoccupy=1;
							}else{
								try{
									if(partie.getJoueurActuel().getActive().getNbrePions()+partie.getJoueurActuel().getActive().getPeuple().conquerir(pla.T[qqqqq][ppppp])>pla.T[qqqqq][ppppp].getNbrePions()
											+1+pla.T[qqqqq][ppppp].getJoueur().getActive().getPouvoir().defendre())
										{partie.getJoueurActuel().ajoutRegion(pla.T[qqqqq][ppppp]);	startoccupy=1;
										}
									else
									{
										int die=usedie(partie.getJoueurActuel().getActive().getPouvoir());
										if(partie.getJoueurActuel().getActive().getNbrePions()+die+partie.getJoueurActuel().getActive().getPeuple().conquerir(pla.T[qqqqq][ppppp])>pla.T[qqqqq][ppppp].getNbrePions()+1+pla.T[qqqqq][ppppp].getJoueur().getActive().getPouvoir().defendre())
										{
											partie.getJoueurActuel().ajoutRegionbydie(pla.T[qqqqq][ppppp]);	startoccupy=1;
										}
										draw3();
										step="deploy";
										dialogue_deploy();
									}
								}catch(NullPointerException n){
									if(partie.getJoueurActuel().getActive().getNbrePions()+partie.getJoueurActuel().getActive().getPeuple().conquerir(pla.T[qqqqq][ppppp])>pla.T[qqqqq][ppppp].getNbrePions()+1)
										{partie.getJoueurActuel().ajoutRegion(pla.T[qqqqq][ppppp]);	startoccupy=1;}
									else
									{
										int die=usedie(partie.getJoueurActuel().getActive().getPouvoir());
										if(partie.getJoueurActuel().getActive().getNbrePions()+die+partie.getJoueurActuel().getActive().getPeuple().conquerir(pla.T[qqqqq][ppppp])>pla.T[qqqqq][ppppp].getNbrePions()+1)
										{
											{	partie.getJoueurActuel().ajoutRegionbydie(pla.T[qqqqq][ppppp]);	startoccupy=1;}
										}
										draw3();
										step="deploy";
										dialogue_deploy();
									}
								}
							}
						}
						
						if	(partie.getJoueurActuel().getActive().getNbrePions()==0&&step!="deploy"){
							draw3();
							step="deploy";
							dialogue_deploy();
						}
					}
					
		           	draw3();
				} 	// fin if(page==2)&&(step==occupy)
				if((page==2)&&(step=="occupy")&&press=="from"&&startoccupy==0)
				{
					
					int ppppp=(e.getX()-20)/150;
					int qqqqq=(e.getY()-20)/85;
					if((qqqqq<6)&&(ppppp>0)&&(qqqqq>0))
					{}
					else if(partie.getJoueurActuel().getActive().is_in(pla.T[fromy][fromx]))
					{	pla.T[fromy][fromx].moisnbpions();
					partie.getJoueurActuel().getActive().deployplusPoints();
						if(pla.T[fromy][fromx].getNbrePions()==0)
						partie.getJoueurActuel().getActive().anandonnerRegion(pla.T[fromy][fromx]);}
					
				}
				
				if((page==2)&&(step=="deploy")&&done!="fin")
				{
					int ppppp=(e.getX()-20)/150;
					int qqqqq=(e.getY()-20)/85;
					
					if((press=="peuple")&&(partie.getJoueurActuel().getActive().getNbrePions()>0))
					{ 
						ppppp=(e.getX()-20+550)/150;
						qqqqq=(e.getY()-20+550)/85;
					}
				
					if((qqqqq<6)&&(ppppp>0)&&(qqqqq>0))
					{
						if(partie.getJoueurActuel().getActive().is_in(pla.T[qqqqq][ppppp])){
							
							if(press=="from"&&pla.T[fromy][fromx].getNbrePions()>1&&(partie.getJoueurActuel().getActive().is_in(pla.T[fromy][fromx]))){
								pla.T[fromy][fromx].moisnbpions();
								pla.T[qqqqq][ppppp].plusnbpions();
								if(pla.T[fromy][fromx].getNbrePions()==0)
									partie.getJoueurActuel().getActive().anandonnerRegion(pla.T[fromy][fromx]);
							}
							
							//pendant le redéploiement on peut avoir encore des piosn en mains 
							//(echec derniere conquète),on permet ici de les remettre sur le plateau
							if((press=="peuple")&&(partie.getJoueurActuel().getActive().getNbrePions()>0)){		
								partie.getJoueurActuel().getActive().deploymoisPoints();
								pla.T[qqqqq][ppppp].plusnbpions();
							}
							press="";	
							done="Done";
						}
					}
					else
					{	if(press=="from"&&pla.T[fromy][fromx].getNbrePions()>1&&(partie.getJoueurActuel().getActive().is_in(pla.T[fromy][fromx]))){	pla.T[fromy][fromx].moisnbpions();
					partie.getJoueurActuel().getActive().deployplusPoints();
					}
						
						
						
						
					}
					// ici on permet au joueur de reprendre des pions en main, ce qui est inutile. les mouvement doivent sefaire entre cases du plateau.
					//if ((qqqqq>=6)&&(press=="from")&&(pla.T[fromy][fromx].getNbrePions()>0)){
					//	pla.T[fromy][fromx].moisnbpions();
					//	partie.getJoueurActuel().getActive().deployplusPoints();
					//}
					press="";	
					draw3();
					
				}
					
		}	//fin MouserReleased

		public void mousePressed(MouseEvent e) {
			
			// on identifie l'endroit ou à lieu l'appui sur le bouton de la souris
			// quand on est sur la page de plateau, on peu cliquer sur la tuile de peuple

			if(page==2){
				if(e.getSource()==jjjj3){
					press="peuple";
					System.out.println("pression sur la tuile peuple");
					//draw3();
				}
				
				if(e.getSource()==plateau){ // phase de redéploiement
					int pppp=(e.getX()-20)/150;
					int qqqq=(e.getY()-20)/85;
					//quand on clique sur une region, on identifie la région selectionnée
					// les coordonées sont stockées dans pppp et qqqq
					if((qqqq<6)&&(pppp>0)&&(qqqq>0)){
						if((partie.getJoueurActuel().getActive().is_in(pla.T[qqqq][pppp]))&&(pla.T[qqqq][pppp].getNbrePions()>0)){
							press="from";
							fromx=pppp;fromy=qqqq;
						}
					}
					//	System.out.println(press+e.getX()+" "+e.getY());
				}
			}
		}
		
		public void mouseExited(MouseEvent e) {}
		public void mouseEntered(MouseEvent e) {}
		public void mouseClicked(MouseEvent e) {
			int x=e.getX();
			int y=e.getY();
			int i=0;
			if(page==0)
			{		// si le clic a lieu sur la page d'acceuil sur le "nouvelle partie", on démarre la partie, on bascule sur la selection de joueur
				if((x>270)&&(x<530)&&(y>250)&&(y<320))
					{
					ST.start();	
					swapPlateau(1);}
				if((x>211)&&(x<596)&&(y>360)&&(y<410))
				{
					 try {
in = new ObjectInputStream(new FileInputStream("t.tmp"));
					} catch (FileNotFoundException e1) {dialogue(0,-1);
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				
					
					try {
						
						
				
						pile=(Pile) in.readObject();
					
						partie=(Partie) in.readObject();
						nbplayer=(Integer) in.readObject();
						indice=(Integer) in.readObject();
					
					page=(Integer) in.readObject();	
					press= (String) in.readObject();
					int ssss=0;	
					ssss= (Integer) in.readObject();
					if(ssss==0)
						step=" ";
					else if(ssss==1)
						step="occupy";
					else
						step="deploy";
						done=(String) in.readObject();
					isdeclin=(Boolean) in.readObject();
					pla=(Plateau) in.readObject();
					tour=(Integer) in.readObject();

					in.close();
					System.out.println(pile);
					System.out.println(partie);
					System.out.println(nbplayer);
					System.out.println(indice);
					System.out.println("page "+page);
					System.out.println("press "+press);
					System.out.println("step "+step);
					System.out.println(done);
					System.out.println(isdeclin);
					System.out.println(pla);
					System.out.println(tour);				

							if(page!=0)
							{	swapPlateau(page);	ST.start();	}
							else
								{dialogue(0,-1);
								}
			
					//	for(int jj=1;jj<=11;jj++)
				//System.out.println(in.readObject());
					} catch (ClassNotFoundException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}}
				
					// si le clic à lieu sur "quitter" on appelle la fonction de boite de dialogue, qui vas nous demander confrmation avant de quitter
				if((x>310)&&(x<510)&&(y>481)&&(y<538)){	
					dialogue(0,0);
				}
		
			
			
			}
			else if((page==1)&&(x<2*width/3)){
				i=6*y/(height-20);
				draw2(i);
			}
			else if(page==3){
				System.out.println(x+" "+y);
				if((x-400)*(x-400)+(y-525)*(y-525)<7825){
					page=0;
					swapPlateau(1);
				}
				if(e.getSource()==quitter){
					dialogue(0,0);
				}
			}
		}
	}	//fin movoListener
}